Модуль:Football box/base/песочница

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Документация
-- общие функции и переменные для [[Модуль:Football box]] и [[Модуль:Football box collapsible]]
local p = {}

p.labels = {
	['aet'] = '[[Дополнительное время#В футболе|доп. вр.]]',
	['agg'] = 'по сумме двух матчей', --(только для Football box collapsible)
	['agget'] = '[[Дополнительное время#Футбол|доп. вр.]] / [[Золотой гол|зол. гол]]',
	['asdet'] = '[[Правило мгновенной смерти|мгн. см.]]',
	['asget'] = '[[Дополнительное время#Футбол|доп. вр.]] / [[Серебряный гол|сер. гол]]',
	['assistantreferee'] = 'Помощник судьи:', --(только для Football box collapsible)
	['assistantreferees'] = 'Помощники судьи:', --(только для Football box collapsible)
	['assistantreferee1'] = 'Помощник судьи:', --(только для Football box collapsible)
	['assistantreferee2'] = 'Помощник судьи:', --(только для Football box collapsible)
	['assistantreferees2'] = '<span style="visibility:hidden">Помощники судьи:</span>', --(только для Football box collapsible)
	['assistantVAR'] = 'Ассистент видеопомощника судьи (VAR):', --(только для Football box collapsible)
	['assistantsVAR'] = 'Ассистенты видеопомощника судьи (VAR):', --(только для Football box collapsible)
	['attendance'] = 'Зрителей:',
	['fifthofficial'] = 'Пятый судья:', --(только для Football box collapsible)
	['fourthofficial'] = 'Резервный судья:', --(только для Football box collapsible)
	['goallineassistants'] = 'Судьи на линии:', --(только для Football box collapsible)
	['goallineassistant2'] = '<span style="visibility:hidden">Судьи на линии:</span>', --(только для Football box collapsible)
	['motm'] = 'Игрок матча:', --(только для Football box collapsible)
	['mvp'] = 'MVP:', --(только для Football box collapsible)
	['note'] = 'Примечание:', --(только для Football box collapsible)
	['pen'] = '[[Послематчевые пенальти|пен.]]',
	['penalties'] = '[[Послематчевые пенальти|Пенальти]]',
	['potm'] = 'Игрок матча:', --(только для Football box collapsible)
	['referee'] = 'Судья:',
	['seealso'] = 'См. также:', --(только для Football box collapsible)
	['shootout'] = '[[Послематчевые пенальти|Пенальти]]',
	['so'] = '[[Послематчевые пенальти|пен.]]',
	['squad1'] = 'Первая команда:',
	['squad2'] = 'Вторая команда:',
	['stadium'] = 'Стадион:',
	['VAR'] = 'Видеопомощник судьи (VAR):', --(только для Football box collapsible)
	['зрителей'] = 'Зрителей:',
	['пен'] = '[[Послематчевые пенальти|пен.]]',
	['стадион'] = 'Стадион:',
	['судья'] = 'Судья:'
}

p.valid_args = {
	['aet'] = true, --дополнительное время
	['aggregatescore'] = true, --суммарный счёт по итогам нескольких игр (только для Football box collapsible)
	['assistantreferee'] = true, --помощник судьи (только для Football box collapsible)
	['assistantreferee2'] = true, --помощник судьи (только для Football box collapsible)
	['assistantreferees'] = true, --помощники судьи (только для Football box collapsible)
	['assistantVAR'] = true, --ассистент видеопомощника судьи (только для Football box collapsible)
	['assistantsVAR'] = true, --ассистенты видеопомощника судьи (только для Football box collapsible)
	['attendance'] = true, --зрители
	['bars'] = true, --(только для Football box collapsible)
	['bg'] = true, --фон
	['class'] = true, --(только для Football box collapsible)
	['date'] = true, --дата
	['event'] = true, --турнир (только для Football box)
	['format'] = true, --формат (только для Football box collapsible)
	['fifthofficial'] = true, --судья5 (только для Football box collapsible)
	['fourthofficial'] = true, --резервный судья (только для Football box collapsible)
	['goallineassistants'] = true, --судьи на линии (только для Football box collapsible)
	['goallineassistant2'] = true, --судьи на линии2 (только для Football box collapsible)
	['goals1'] = true, --голы1
	['goals2'] = true, --голы2
	['id'] = true, --якорь
	['location'] = true, --место
	['motm'] = true, --игрок матча (только для Football box collapsible)
	['mvp'] = true, --самый ценный игрок (только для Football box collapsible)
	['nobars'] = true, --(только для Football box collapsible)
	['note'] = true, --(только для Football box collapsible)
	['penalties1'] = true, --пенальти1
	['penalties2'] = true, --пенальти2
	['penaltyscore'] = true, --пенальти
	['potm'] = true, --игрок матча (только для Football box collapsible)
	['referee'] = true, --судья
	['report'] = true, --протокол
	['result'] = true, --стиль оформления (WDL) (только для Football box collapsible)
	['round'] = true, --раунд
	['score'] = true, --счёт
	['score1'] = true, --счёт1
	['score2'] = true, --счёт2
	['scorenote'] = true, --счёт примечание
	['seealso'] = true, --см также (только для Football box collapsible)
	['shootout1'] = true, --(только для Football box collapsible)
	['shootout2'] = true, --(только для Football box collapsible)
	['shootoutscore'] = true, --(только для Football box collapsible)
	['size'] = true, --размер
	['squad1'] = true, --состав1
	['squad2'] = true, --состав2
	['stadium'] = true, --стадион
	['team1'] = true, --команда1
	['team2'] = true, --команда2
	['time'] = true, --время
	['VAR'] = true, --видеопомощник судьи (только для Football box collapsible)
}

function p.isnotempty(s)
	return s and s:match('^%s*(.-)%s*$') ~= ''
end

local rus_args = {
	['ассистентВАР'] = 'assistantVAR', --(только для Football box collapsible)
	['ассистентыВАР'] = 'assistantsVAR', --(только для Football box collapsible)
	['ВАР'] = 'VAR', --(только для Football box collapsible)
	['время'] = 'time',
	['голы1'] = 'goals1',
	['голы2'] = 'goals2',
	['дата'] = 'date',
	['допвремя'] = 'aet',
	['дополнительное время'] = 'aet',
	['зрители'] = 'attendance',
	['игрок матча'] = 'motm', --(только для Football box collapsible)
	['игрок матча'] = 'potm', --(только для Football box collapsible)
	['команда1'] = 'team1',
	['команда2'] = 'team2',
	['место'] = 'location',
	['на линии'] = 'goallineassistants', --(только для Football box collapsible)
	['на линии2'] = 'goallineassistants2', --(только для Football box collapsible)
	['общий счёт'] = 'aggregatescore', --(только для Football box collapsible)
	['отчет'] = 'report',
	['отчёт'] = 'report',
	['пенальти'] = 'penaltyscore',
	['пенальти1'] = 'penalties1',
	['пенальти2'] = 'penalties2',
	['помощник'] = 'assistantreferee', --(только для Football box collapsible)
	['помощник2'] = 'assistantreferee2', --(только для Football box collapsible)
	['помощники'] = 'assistantreferees', --(только для Football box collapsible)
	['примечание'] = 'note', --(только для Football box collapsible)
	['протокол'] = 'report',
	['раунд'] = 'round',
	['размер'] = 'size',
	['резервный'] = 'fourthofficial', --(только для Football box collapsible)
	['результат'] = 'result', --(только для Football box collapsible)
	['см также'] = 'seealso', --(только для Football box collapsible)
	['состав1'] = 'squad1',
	['состав2'] = 'squad2',
	['стадион'] = 'stadium',
	['судья'] = 'referee',
	['судья5'] = 'fifthofficial', --(только для Football box collapsible)
	['счёт'] = 'score',
	['счёт1'] = 'score1',
	['счёт2'] = 'score2',
	['счёт примечание'] = 'scorenote',
	['турнир'] = 'event', --(только для Football box)
	['фон'] = 'bg',
	['формат'] = 'format', --(только для Football box collapsible)
}

function p.checkarg(k, v, cat, tracking, preview)
	if k and type(k) == 'string' then
		if p.valid_args[k] then
-- valid and not tracked
		elseif p.isnotempty(rus_args[k]) then
-- valid rus param
		else
-- invalid
			local vlen = mw.ustring.len(k)
			k = mw.ustring.sub(k, 1, (vlen < 25) and vlen or 25)
			k = mw.ustring.gsub(k, '[^%w%-_ ]', '?')
			table.insert(tracking, '[[Категория:' .. cat .. '|' .. k .. ']]')
			table.insert(preview, '"' .. k .. '"')
		end
	end
end

function p.trim(s)
	if p.isnotempty(s) then
		s = s:match('^[\'"%s]*(.-)[\'"%s]*$')
		return p.isnotempty(s) and s or nil
	end
	return nil
end

function p.bold(s)
	if p.isnotempty(s) then
		return "'''" .. s .. "'''"
	end
	return ""
end

function p.italic(s)
	if p.isnotempty(s) then
		return "''" .. s .. "''"
	end
	return ""
end

function p.small(s)
	if p.isnotempty(s) then
		return '<small>' .. s .. '</small>'
	end
	return ''
end

function p.nowrap(s)
	if p.isnotempty(s) then
		return '<span style="white-space:nowrap">' .. s .. '</span>'
	end
	return ''
end

function p.fmtlist(s)
	s = mw.ustring.gsub(s or '', '%[%[ *([%?-]) *%]%]', '%1')
	s = mw.ustring.gsub(s, '%[%[ *[%?-] *| *(.-) *%]%]', '%1')
	if mw.ustring.sub(s, 1, 1) == '*' then
		return tostring(mw.html.create('div'):addClass('plainlist'):newline():wikitext(s))
	end
	return s
end

function p.makelink(s, t)
	if s:match('^[Hh][Tt][Tt][Pp][Ss]?:[^ ]*$') then
		return '[' .. s .. ' ' .. t .. ']'
	end
	return s
end

-- здесь бы подошло регулярное выражение, похожее на
-- ^(?:\{\{.+\}\})?\s*(?:\[\[(?:[^\]]+\|)?)?([^\]]+)(?:\]\])?\s*(?:\{\{.+\}\})?
-- , но в Lua есть  паттерны, а не регулярные выражения, поэтому перебираем варианты вручную
local span_begin = '<span class="flagicon">'
local span_end = '</span>'

local any_file = '%[%[File:.+%]%]'
local any_file_ru = '%[%[Файл:.+%]%]'
local any_space = '%s*'
local nbsp = '&nbsp;'
local flagicon = span_begin .. '%[%[Файл:.+%]%]' .. span_end
local clarification = '%b()'
local wikilink_text = '%[%[.+|([^%]]+)%]%]'
local wikilink_same = '%[%[([^%]]+)%]%]'
local nolink = '([^%[%]]+)'

local spaces = {any_space, nbsp}
local targets = {
	wikilink_text, wikilink_text .. any_space .. clarification,
	wikilink_same, wikilink_same .. any_space .. clarification,
	nolink, nolink .. any_space .. clarification}

local function check_any_pattern(s, patterns)
	for _, pattern in ipairs(patterns) do
		for m in mw.ustring.gmatch(s, pattern) do
			return p.trim(m)
		end
	end
	return s
end

local function pattern_maker(list, fun)
	for _, target in ipairs(targets) do
		for _, space in ipairs(spaces) do
			table.insert(list, fun(space, target) .. "$")
		end
	end
end

function p.check_team_pattern(s)
	local team_with_possible_flags = {}
-- сначала проверяем шаблон {{флаг|}}, чтобы gmatch не захватывал открывающий <span>
	pattern_maker(team_with_possible_flags, function(space, target)
		return flagicon .. space .. target
	end)  -- {{флаг|XX}} спереди
	pattern_maker(team_with_possible_flags, function(space, target)
		return target .. space .. flagicon
	end)  -- {{флаг|XX}} сзади
	pattern_maker(team_with_possible_flags, function(space, target)
		return any_file .. space .. target
	end) -- {{флаг XX}} спереди
	pattern_maker(team_with_possible_flags, function(space, target)
		return target .. space .. any_file
	end) -- {{флаг XX}} сзади
	pattern_maker(team_with_possible_flags, function(space, target)
		return any_file_ru .. space .. target
	end) -- {{флаг XX}} спереди, в шаблоне используется синтаксис Файл:
	pattern_maker(team_with_possible_flags, function(space, target)
		return target .. space .. any_file_ru
	end) -- {{флаг XX}} сзади, в шаблоне используется синтаксис Файл:
	for _, t in ipairs(targets) do
		table.insert(team_with_possible_flags, t)
	end
	return check_any_pattern(s, team_with_possible_flags)
end

function p.process_rus_params(args)
	for rus, en in pairs(rus_args) do
		if p.isnotempty(args[rus]) then
			args[en] = args[rus]
			args[rus] = nil
		end
	end
end

function p.print_rus_params(frame)
	local wtable = mw.html.create('table'):addClass("wikitable sortable")
	local row = wtable:tag('tr')
	row:tag('th'):wikitext('Русский параметр')
	row:tag('th'):wikitext('Английский параметр')
	local sorted = {}
	for k, _ in pairs(rus_args) do
		sorted[#sorted + 1] = k
	end
	table.sort(sorted)
	for _, rus in ipairs(sorted) do
		row = wtable:tag('tr')
		row:tag('td'):wikitext(rus)
		row:tag('td'):wikitext(rus_args[rus])
	end
	return tostring(wtable)
end

return p